#pragma once

#include <string>

#include "datasetdefine.h"


class DcmDataset;

class IDataSet
{
public:
    ~IDataSet() = default;

public:
    virtual bool
    ParseIODString(
        const std::string& aJsonString
    ) = 0;

    virtual bool
    GeneralDCMFile(
        const std::string& aFilePath,
        DCM_TransferSyntax aXfer
    ) = 0;

    virtual bool
    LoadDCMFile(
        const std::string& aFilePath
    ) = 0;

    virtual DcmDataset*
    GetDataSet()
    = 0;

    //float, double, unsigned int, unsigned short, signed short, string, signed int, unsigned char*
    //float*, double*, unsigned int*, unsigned short*, signed short*
    //13 x 4
    virtual bool
    Set(
        const std::string& aFieldName,
        const float aValue
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const signed short aValue
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const signed int aValue
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const unsigned int aValue
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const signed short* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const unsigned int* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const float* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const double* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const std::string& aValue
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const unsigned short aValue
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const unsigned char* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const unsigned short* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName
    ) = 0;

    virtual bool
    Set(
        const std::string& aFieldName,
        const double aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const float aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const signed short aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const signed int aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const unsigned int aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const signed short* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const unsigned int* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const float* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const double* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const std::string& aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const unsigned char* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const unsigned short* aValue,
        const unsigned long aCount
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const double aValue
    ) = 0;

    virtual bool
    SetPrivate(
        const std::string& aFieldName,
        const std::string& aPrivateName,
        const unsigned short aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        float& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        double& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        unsigned int& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        unsigned short& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        signed short& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        std::string& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        signed int& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        const unsigned char*& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        const float*& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        const double*& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        const unsigned int*& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        const unsigned short*& aValue
    ) = 0;

    virtual bool
    Get(
        const std::string& aFieldName,
        const signed short*& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        float& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        double& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        unsigned int& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        unsigned short& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        signed short& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        std::string& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        signed int& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        const unsigned char*& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        const float*& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        const double*& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        const unsigned int*& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        const unsigned short*& aValue
    ) = 0;

    virtual bool
    GetPrivate(
        const std::string& aFieldName,
        std::string& aPrivateCreator,
        const signed short*& aValue
    ) = 0;
};
